﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EntitiesAndMappings.Entities;
using ProyectoActivos.Validate;
using ProyectoActivos.Daos;
using ProyectoActivos.Util;

namespace ProyectoActivos.Forms.Operaciones
{
    public partial class FrmEditarSalida : Form, IValidateForm
    {
        private Boolean _valido;
        public Boolean CerroSinAccion { get; set; }
        public DetalleSalidaDAO detalleSalidaDAO;
        Salida salida;

        public FrmEditarSalida(Salida salida)
        {
            InitializeComponent();
             dGridDetalleSalida.AutoGenerateColumns = false;
            CerroSinAccion = true;
            this.salida = salida;
            detalleSalidaDAO = new DetalleSalidaDAO();

        }

        public void Invalid()
        {
            _valido = false;
        }

        public Boolean IsValid()
        {
            return _valido;
        }

        private void FrmEditarSalida_Load(object sender, EventArgs e)
        {
            _valido = true;

            IList<TipoMovimiento> listadoTipoMovimiento;
            IList<Proveedor> listadoProveedor;
            IList<Almacen> listadoAlmacen;
            IList<Proyecto> listadoProyecto;
            IList<Lote> listadoLote;
            IList<Lugar> listadoLugar;
            IList<Articulo> listadoArticulo;
            IList<CondicionEquipo> listadoCondicionEquipo;

            ActionExecutor.Execute(this, delegate
            {
                var tipoMovimientoDAO = new TipoMovimientoDAO();
                listadoTipoMovimiento = tipoMovimientoDAO.ListarTipoMovimientoSalidaActivos();
                cmbTipoMovimiento.DataSource = listadoTipoMovimiento;
                cmbTipoMovimiento.SelectedItem = null;

                var proveedorDAO = new ProveedorDAO();
                listadoProveedor = proveedorDAO.ObtenerActivos();
                cmbProveedor.DataSource = listadoProveedor;
                cmbProveedor.SelectedItem = null;

                var almacenDAO = new AlmacenDAO();
                listadoAlmacen = almacenDAO.ObtenerActivos();
                cmbAlmacen.DataSource = listadoAlmacen;
                cmbAlmacen.SelectedItem = null;

                var proyectoDAO = new EntidadGenericaDAO<Proyecto>();
                listadoProyecto = proyectoDAO.ObtenerActivos();
                cmbProyecto.DataSource = listadoProyecto;
                cmbProyecto.SelectedItem = null;

                var loteDAO = new EntidadGenericaDAO<Lote>();
                listadoLote = loteDAO.ObtenerActivos();
                cmbLote.DataSource = listadoLote;
                cmbLote.SelectedItem = null;

                var lugarDAO = new EntidadGenericaDAO<Lugar>();
                listadoLugar = lugarDAO.ObtenerActivos();
                cmbLugar.DataSource = listadoLugar;
                cmbLugar.SelectedItem = null;

                var articuloDAO = new ArticuloDAO();
                listadoArticulo = articuloDAO.ObtenerActivos();
                cmbArticulo.DataSource = listadoArticulo;
                cmbArticulo.SelectedItem = null;

                var condicionEquipoDAO = new EntidadGenericaDAO<CondicionEquipo>();
                listadoCondicionEquipo = condicionEquipoDAO.ObtenerActivos();
                cmbCondicionEquipo.DataSource = listadoCondicionEquipo;
                cmbCondicionEquipo.SelectedItem = null;
            });

            if (salida.Id != 0)
            {

                cmbTipoMovimiento.SelectedIndex = ComboUtils.GetIndice(cmbTipoMovimiento, salida.TipoMovimiento.Id);

                cmbProveedor.SelectedIndex = ComboUtils.GetIndice(cmbProveedor, salida.Proveedor.Id);

                if (salida.Almacen != null)
                {
                    cmbAlmacen.SelectedIndex = ComboUtils.GetIndice(cmbAlmacen, salida.Almacen.Id);
                }

                if (salida.Proyecto != null)
                {
                    cmbProyecto.SelectedIndex = ComboUtils.GetIndice(cmbProyecto, salida.Proyecto.Id);
                }

                if (salida.Lote != null)
                {
                    cmbLote.SelectedIndex = ComboUtils.GetIndice(cmbLote, salida.Lote.Id);
                }

                if (salida.Lugar != null)
                {
                    cmbLugar.SelectedIndex = ComboUtils.GetIndice(cmbLugar, salida.Lugar.Id);
                }

                
             

               
                datFecha.Value = salida.Fecha;

                txtNroGuia.Text = salida.NumeroGuia;

                txtOrdenServicio.Text = salida.OrdenServicio;

                txtUbicacion.Text = salida.Ubicacion;

                dGridDetalleSalida.DataSource = salida.Items;
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbArticulo, errorProvider, this);
            FormsAssert.AssertTextBoxOnlyPositiveNumbers(txtCantidad, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbCondicionEquipo, errorProvider, this);

            //Revisamos si el articulo ya está agregado al detalle
            foreach (DetalleSalida detalle in salida.Items)
            {
                if (detalle.Articulo.Equals((Articulo)cmbArticulo.SelectedItem))
                {
                    MessageBox.Show("El artículo ya se agregó al detalle, para modificarlo, elimínelo del detalle y vuelva a elegirlo especificando las propiedades deseadas");
                    return;
                }
            }

            ActionExecutor.Execute(this, delegate
            {

                salida.AgregarDetalleItem(new DetalleSalida()
                {
                    Articulo = (Articulo)cmbArticulo.SelectedItem,
                    Cantidad = int.Parse(txtCantidad.Text),
                    CondicionEquipo = (CondicionEquipo)cmbCondicionEquipo.SelectedItem,
                    Partes = txtPartes.Text,
                    Consumibles = txtConsumibles.Text,
                    ObservacionesMantenimiento = txtObservacion.Text
                }
            );

                dGridDetalleSalida.DataSource = null;
                dGridDetalleSalida.DataSource = salida.Items;
            });

        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            CerroSinAccion = false;

            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbTipoMovimiento, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbProveedor, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtNroGuia, 20, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtOrdenServicio, 20, errorProvider, this);

            if (radOpcion1.Checked)
            {
                FormsAssert.AssertComboBoxSelected(cmbTipoMovimiento, errorProvider, this);
            }
            else
            {
                FormsAssert.AssertComboBoxSelected(cmbProyecto, errorProvider, this);
                FormsAssert.AssertComboBoxSelected(cmbLote, errorProvider, this);
                FormsAssert.AssertComboBoxSelected(cmbLugar, errorProvider, this);
            }

            FormsAssert.AssertTextBoxNotEmptyAndSize(txtUbicacion, 50, errorProvider, this);

            if(salida.Items.Count == 0)
            {
                MessageBox.Show("No se puede grabar una salida sin detalle");
                return;
            }

            ActionExecutor.Execute(this, delegate
            {
                var salidaDAO = new SalidaDAO();
                salida.TipoMovimiento = (TipoMovimiento)cmbTipoMovimiento.SelectedItem;
                salida.Fecha = datFecha.Value.Date;
                salida.Proveedor = (Proveedor)cmbProveedor.SelectedItem;
                salida.NumeroGuia = txtNroGuia.Text;
                salida.OrdenServicio = txtOrdenServicio.Text;
                salida.Almacen = (Almacen)cmbAlmacen.SelectedItem;
                salida.Proyecto = (Proyecto)cmbProyecto.SelectedItem;
                salida.Lote = (Lote)cmbLote.SelectedItem;
                salida.Lugar = (Lugar)cmbLugar.SelectedItem;
                salida.Ubicacion = txtUbicacion.Text;
                salidaDAO.Update(salida);
                Close();
            });



        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dGridDetalleSalida.CurrentRow != null)
            {
                DetalleSalida detalleSalida = (DetalleSalida)dGridDetalleSalida.CurrentRow.DataBoundItem;

                salida.QuitarDetalleItem(detalleSalida);

                dGridDetalleSalida.DataSource = null;
                dGridDetalleSalida.DataSource = salida.Items;
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void btnEntregaEquipo_Click(object sender, EventArgs e)
        {
            if (dGridDetalleSalida.SelectedRows.Count > 0)
            {

                var detalleSalida = (DetalleSalida)dGridDetalleSalida.CurrentRow.DataBoundItem;
                var form = new FrmEditarEntregaEquipos(detalleSalidaDAO.Refresh(detalleSalida));
                form.ShowDialog(this);
               
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void cmbTipoMovimiento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cmbTipoMovimiento.SelectedItem != null)
            {
                btnEntregaAPersonal.Visible = ((TipoMovimiento) cmbTipoMovimiento.SelectedItem).EntregaAPersonal;
            }
        }
    }
}
